﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.reportes;
using produccion.vistamodelo;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMinfCumPed.xaml
    /// </summary>
    public partial class FRMinfCumPed : Window
    {
        public FRMinfCumPed()
        {
            InitializeComponent();
        }

        private void butPro_Click(object sender, RoutedEventArgs e)
        {
            infCumPed.Instance.procesar();
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void butImp_Click(object sender, RoutedEventArgs e)
        {
            infCumPed.Instance.imprimir();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            infCumPed.Instance = null;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Keyboard.Focus(combCli);
        }

        private void dataGrid1_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }
    
    }

    public class infCumPed:ObservableObject 
    {


        #region singleton
        private static infCumPed instance = null;
        
        protected infCumPed()
        {
            consCli();
            MDOgeneral.conectar();
            strTituloVentana = "Informe de cumplimientos por pedido - Usuario: " + MDOgeneral.usuario + " - [FRMinfCumPed]";
        }
       
        public static infCumPed Instance
        {
            get
            {
                if (instance == null)
                    instance = new infCumPed();
                    return instance;
            }
            set { 
                if (instance != null)
                instance = null;
            }
        }
        #endregion

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }
        
        DateTime _desde = DateTime.Today;
        public DateTime desde 
        {
            get { return _desde; }
            set { _desde = value; RaisePropertyChangedEvent("desde"); }
        }

        DateTime _hasta = DateTime.Today;
        public DateTime hasta 
        {
            get { return _hasta; }
            set { _hasta = value; RaisePropertyChangedEvent("hasta"); }
        }

        List<clases.CLSMAECLIP> _lisCli = new List<clases.CLSMAECLIP>();
        public List<clases.CLSMAECLIP> lisCli 
        {
            get { return _lisCli; }
            set { _lisCli = value; RaisePropertyChangedEvent("lisCli"); }
        }

        clases.CLSMAECLIP _selCli = new clases.CLSMAECLIP();
        public clases.CLSMAECLIP selCli 
        {
            get{  return _selCli;}
            set { _selCli = value; RaisePropertyChangedEvent("selCli"); }        
        }

        public void consCli() 
        {
            try 
            {
                lisCli = selCli.listaCliente();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private DataTable _informe = new DataTable("TMPCUMPED");
        public DataTable informe 
        {
            get { return _informe; }
            set { _informe = value; RaisePropertyChangedEvent("informe"); }
        }

        private double _Pedido;
        public double Pedido 
        {
            get { return _Pedido; }
            set { _Pedido = value; RaisePropertyChangedEvent("Pedido"); }
        }

        private double _Entregado;
        public double Entregado 
        {
            get { return _Entregado; }
            set { _Entregado = value; RaisePropertyChangedEvent("Entregado"); }
        }

        private double _Pendiente;
        public double Pendiente 
        {
            get { return _Pendiente; }
            set{ _Pendiente=value; RaisePropertyChangedEvent("Pendiente"); }        
        }

        private int _Pcompra;
        public int Pcompra
        {
            get { return _Pcompra; }
            set { _Pcompra = value; RaisePropertyChangedEvent("Pcompra"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; base.OnPropertyChanged("visorFotoReferencia"); }
        }

        private int _index;
        public int index {
            get { return _index; }
            set 
            { 
                _index = value;
                if (_index != -1) 
                {
                    visorFotoReferencia.strCodigo = informe.Rows[_index]["CODREF_TMP"].ToString();
                    visorFotoReferencia.strColor = informe.Rows[_index]["CODCOL_TMP"].ToString();
                }
                RaisePropertyChangedEvent("index");
            }
        }

        private BitmapImage _imagen1 = new BitmapImage();
        public BitmapImage imagen1
        {
            get { return _imagen1; }
            set { _imagen1 = value; RaisePropertyChangedEvent("imagen1"); }
        }
        
        public void procesar() 
        {
            try 
            {
                DataTable info = new DataTable("TMPCUMPED");
                info.Columns.Add("CODCLI_TMP");
                info.Columns.Add("NOMCLI_TMP");
                info.Columns.Add("NROPED_TMP");
                info.Columns.Add("FECENT_TMP");
                info.Columns.Add("CODREF_TMP");
                info.Columns.Add("CODCOL_TMP");
                info.Columns.Add("NOMREF_TMP");
                info.Columns.Add("NOMCOL_TMP");
                info.Columns.Add("CANPED_TMP");
                info.Columns.Add("CANENT_TMP");
                info.Columns.Add("CANPEN_TMP");
                info.Columns.Add("PORCEN_TMP");
                info.Columns.Add("GRPCLI");
                info.Columns.Add("GRPPED");
         
                clases.CLSTEMPORAL tmp = new clases.CLSTEMPORAL();
                tmp.SP_INFCUMPED(selCli!=null?selCli.CODCLI_CLI:"", desde, hasta);
                DataTable val = tmp.TMPCUMPED;
               
                foreach (DataRow r in val.Rows) 
                {
                    DataRow fila = info.NewRow();
                    fila["CODCLI_TMP"]=r["CODCLI_TMP"];
                    fila["NOMCLI_TMP"]=r["NOMCLI_TMP"];
                    fila["NROPED_TMP"]=r["NROPED_TMP"];
                    fila["FECENT_TMP"]=r["FECENT_TMP"];
                    fila["CODREF_TMP"]=r["CODREF_TMP"];
                    fila["CODCOL_TMP"]=r["CODCOL_TMP"];
                    fila["NOMREF_TMP"]=r["NOMREF_TMP"];
                    fila["NOMCOL_TMP"]=r["NOMCOL_TMP"];
                    fila["CANPED_TMP"]=r["CANPED_TMP"];
                    fila["CANENT_TMP"]=r["CANENT_TMP"];
                    fila["CANPEN_TMP"]=r["CANPEN_TMP"];
                    fila["PORCEN_TMP"]=r["PORCEN_TMP"];
                    info.Rows.Add(fila);
                }

                //GRP CLI
                string cliente="";
                double pedido = 0, entregado=0,pendiente=0;
                foreach (DataRow r in val.Rows)
                {
                    if (!cliente.Equals(r["CODCLI_TMP"].ToString().Trim()))
                    {
                        if (!String.IsNullOrEmpty(cliente))
                        {
                            foreach (DataRow fila in info.Rows)
                            {
                                if (fila["CODCLI_TMP"].ToString().Trim().Equals(cliente))
                                {
                                    fila["GRPCLI"] = fila["NOMCLI_TMP"].ToString() + "  Pedido=" + pedido.ToString() + "   Entregado=" + entregado.ToString() + "     Pendiente=" + pendiente.ToString()+"     %Compra="+(100*entregado/pedido).ToString("#,0");
                                }
                            }
                        }
                        cliente = r["CODCLI_TMP"].ToString().Trim();
                        pedido = 0;
                        entregado = 0;
                        pendiente = 0;
                    }
                    pedido =pedido+ Convert.ToDouble(r["CANPED_TMP"]);
                    entregado = entregado + Convert.ToDouble(r["CANENT_TMP"]);
                    pendiente = pendiente + Convert.ToDouble(r["CANPEN_TMP"]);
                }
                if (!String.IsNullOrEmpty(cliente))
                {
                    foreach (DataRow fila in info.Rows)
                    {
                        if (fila["CODCLI_TMP"].ToString().Trim().Equals(cliente))
                        {
                            fila["GRPCLI"] = fila["NOMCLI_TMP"].ToString() + "  Pedido=" + pedido.ToString() + "   Entregado=" + entregado.ToString() + "     Pendiente=" + pendiente.ToString() + "     %Compra=" + (100 * entregado / pedido).ToString("#,0");
                        }
                    }
                }
                //GRP PED
                string cliped = "";
                double ppedido = 0, pentregado = 0, ppendiente = 0;
                double tpedido=0,tentregado=0,tpendiente=0;

                foreach (DataRow r in val.Rows)
                {
                    if (!cliped.Equals(r["CODCLI_TMP"].ToString().Trim() + r["NROPED_TMP"].ToString().Trim()))
                    {
                        if (!String.IsNullOrEmpty(cliped))
                        {
                            foreach (DataRow fila in info.Rows)
                            {
                                if ((fila["CODCLI_TMP"].ToString() + fila["NROPED_TMP"].ToString()).Equals(cliped))
                                {
                                    fila["GRPPED"] = fila["NROPED_TMP"].ToString() + "  Pedido=" + ppedido.ToString() + "   Entregado=" + pentregado.ToString() + "     Pendiente=" + ppendiente.ToString() + "    %Compra=" + (100 * pentregado / ppedido).ToString("#,0"); 
                                }
                            }
                        }
                        cliped = r["CODCLI_TMP"].ToString() + r["NROPED_TMP"].ToString();
                        ppedido = 0;
                        pentregado = 0;
                        ppendiente = 0;
                    }
                    ppedido = ppedido + Convert.ToDouble(r["CANPED_TMP"]);
                    pentregado = pentregado + Convert.ToDouble(r["CANENT_TMP"]);
                    ppendiente = ppendiente + Convert.ToDouble(r["CANPEN_TMP"]);
                    tpedido=tpedido+Convert.ToDouble(r["CANPED_TMP"]);
                    tentregado=tentregado+Convert.ToDouble(r["CANENT_TMP"]);
                    tpendiente = tpendiente + Convert.ToDouble(r["CANPEN_TMP"]); 
                }
                if (!String.IsNullOrEmpty(cliped))
                {
                    foreach (DataRow fila in info.Rows)
                    {
                        if ((fila["CODCLI_TMP"].ToString() + fila["NROPED_TMP"].ToString()).Equals(cliped))
                        {
                            fila["GRPPED"] = fila["NROPED_TMP"].ToString() + "  Pedido=" + ppedido.ToString() + "   Entregado=" + pentregado.ToString() + "     Pendiente=" + ppendiente.ToString() + "    %Compra=" + (100 * pentregado / ppedido).ToString("#,0"); 
                        }
                    }
                }

                Pedido = tpedido;
                Entregado = tentregado;
                Pendiente = tpendiente;
                if (tpedido>0)
                    Pcompra = Convert.ToInt32(100 * tentregado / tpedido);

                informe = info;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
        public void imprimir() 
        {
            try 
            {
                DataSet ds = new DataSet("dsInfCumPed");
                DataTable encabezado = new DataTable("ENCABEZADO");
                encabezado.Columns.Add("DESDE");
                encabezado.Columns.Add("HASTA");
                encabezado.Columns.Add("NOMCLI");
                DataRow r = encabezado.NewRow();
                r["DESDE"] = desde.ToShortDateString();
                r["HASTA"] = hasta.ToShortDateString();
                r["NOMCLI"] = selCli==null?"TODOS":selCli.NOMCLI_CLI == null ? "TODOS" : selCli.NOMCLI_CLI;
                encabezado.Rows.Add(r);
                ds.Tables.Add(encabezado);
                informe.TableName = "TMPCUMPED";
                ds.Tables.Add(informe.Copy());
                DataTable totales = new DataTable("TOTALES");
                totales.Columns.Add("PEDIDO");
                totales.Columns.Add("ENTREGADO");
                totales.Columns.Add("PENDIENTE");
                totales.Columns.Add("PCOMPRA");
                DataRow f = totales.NewRow();
                f["PEDIDO"] = Pedido;
                f["ENTREGADO"] = Entregado;
                f["PENDIENTE"] = Pendiente;
                f["PCOMPRA"] = Pcompra;
                totales.Rows.Add(f);
                ds.Tables.Add(totales);
                Vista vista = new Vista { ds = ds, reporte = @"reportes\repInfCumPed.rpt" };
                vista.Show();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

    }

}
